#ifndef SERVIDOR_HPP_INCLUDED
#define SERVIDOR_HPP_INCLUDED

#include <list>
#include <sys/select.h>

#include "common_Socket.h"
#include "client_Cliente.h"

#include "common_Mensaje.h"

#include "common_ColaThreadSafe.h"

#define BACKLOG 10

#define ERROR_BIND -200
#define NOT_LISTEN -300

class Servidor: public Socket{
    protected:
    short Puerto;
    ColaThreadSafe<Mensaje>& ColaMensajes;
    public:
    Servidor(ColaThreadSafe<Mensaje>& C):Socket(),Puerto(0),ColaMensajes(C)
    {
        //std::cout << "Server Up and Running!" << std::endl;
    }
    ~Servidor();

    void SetearPuerto( short P )
    {
        this->Puerto = P;
    }

    //tengo entendido que NO es bloqueante
    int Listen( short PUERTO );

    //devuelve un socket esclavo que se comunica con el cliente
    //ya esta corriendo sobre otro thread
    int Aceptar();

    virtual void run() = 0;

    //PRE CONDICION : HAY QUE STOPEAR EL THREAD DONDE CORRE EL SERVER ANTES
    //Cierro el socket del servidor principal que Listeneaba
    //Paro todos los threads (slavesServ) que cree para servir a los clientes entrantes
    //Cierro y Libero todos los slavesServ
    virtual int Liberar() = 0;

/*  int Close();
    void SendData(const std::string& Data);
    void ReciveData( BLQueue<std::string>& Cola );
    virtual int Liberar();                         */
};

#endif // SERVIDOR_HPP_INCLUDED
